package com.wuzhazha.redisdemo.service.impl;

import com.wuzhazha.redisdemo.dao.RoleDao;
import com.wuzhazha.redisdemo.pojo.Role;
import com.wuzhazha.redisdemo.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @Author:wuzhazha
 * @Date: 2018/8/12 01:11
 * @Description:
 */
@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;

    /**
     * 使用@Cacheable 定义缓存策略
     * 当缓存中有值，则返回缓存中的数据，否则访问方法得到数据
     * 通过value引用缓存管理器，通过key定义键
     * @param id 角色编号
     * @return 角色
     */
    @Override
    @Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
    @Cacheable(value="redisCacheManager" ,key = "'redis_role_' + #id")
    public Role getRole(Long id) {
        return roleDao.getRole(id);
    }

    /**
     * 使用@CachePut表示无论如何都会执行方法，最后将方法的返回值再保存到缓存中
     * 使用在插入数据的地方，则表示保存到数据库后，会同期插入到redis缓存中
     * 通过value引用缓存管理器，通过key定义键
     * @param role 角色对象
     * @return 角色（会回填主键）
     */
    @Override
    @Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
    @CachePut(value="redisCacheManager" ,key = "'redis_role_' + #result.id")
    public Role insertRole(Role role) {
        roleDao.insertRole(role);
        return role;
    }

    /**
     * 使用@CachePut表示无论如何都会执行方法，最后将方法的返回值再保存到缓存中
     * 使用在插入数据的地方，则表示保存到数据库后，会同期插入到redis缓存中
     * 通过value引用缓存管理器，通过key定义键
     * @param role 角色对象
     * @return 返回更新记录数
     */
    @Override
    @Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
    @CachePut(value="redisCacheManager" ,key = "'redis_role_' + #role.id")
    public int updateRole(Role role) {
        return roleDao.updateRole(role);
    }

    /**
     * 使用@CacheEvict删除缓存中对应的key
     * @param id 角色编号
     * @return 返回删除记录数
     */
    @Override
    @Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
    @CacheEvict(value="redisCacheManager" ,key = "'redis_role_' + #id")
    public int deleteRole(Long id) {
        return roleDao.deleteRole(id);
    }

    @Override
    @Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
    public List<Role> findRole(String roleName, String note) {
        return roleDao.findRole(roleName,note);
    }
}
